:art: Support mini login relative

huangqimin 5 years ago
parent
commit
74b8a65eb6
4 changed files with 130 additions and 1 deletions
  1. 14 0
      account/models.py
  2. 109 0
      api/mini_views.py
  3. 6 1
      api/urls.py
  4. 1 0
      requirements_dj.txt

+ 14 - 0
account/models.py

@@ -28,6 +28,20 @@ class UserInfo(BaseModelMixin):
28 28
         return self.pk
29 29
 
30 30
     @property
31
+    def data(self):
32
+        return {
33
+            'unionid': self.unionid,
34
+            'openid': self.openid,
35
+            'nickname': self.nickname,
36
+            'sex': self.sex,
37
+            'avatar': self.avatar,
38
+            'phone': self.phone,
39
+            'country': self.country,
40
+            'province': self.province,
41
+            'city': self.city,
42
+        }
43
+
44
+    @property
31 45
     def userinfo(self):
32 46
         return {
33 47
             'nickname': self.nickname,

+ 109 - 0
api/mini_views.py

@@ -0,0 +1,109 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import logging
4
+
5
+from django.conf import settings
6
+from django.db import transaction
7
+from django_logit import logit
8
+from django_response import response
9
+from pywe_miniapp import get_session_info, get_session_key, get_userinfo, store_session_key
10
+from pywe_storage import RedisStorage
11
+
12
+from account.models import UserInfo
13
+from utils.redis.connect import r
14
+
15
+
16
+WECHAT = settings.WECHAT
17
+logger = logging.getLogger('logit')
18
+
19
+
20
+@logit(res=True)
21
+@transaction.atomic
22
+def mini_login_api(request):
23
+    wxcfg = WECHAT.get('MINIAPP', {})
24
+
25
+    appid = wxcfg.get('appID')
26
+    secret = wxcfg.get('appsecret')
27
+
28
+    code = request.POST.get('code', '')
29
+
30
+    # // 正常返回的JSON数据包
31
+    # {
32
+    #     "openid": "OPENID",
33
+    #     "session_key": "SESSIONKEY",
34
+    # }
35
+    #
36
+    # // 满足UnionID返回条件时,返回的JSON数据包
37
+    # {
38
+    #     "openid": "OPENID",
39
+    #     "session_key": "SESSIONKEY",
40
+    #     "unionid": "UNIONID"
41
+    # }
42
+    # // 错误时返回JSON数据包(示例为Code无效)
43
+    # {
44
+    #     "errcode": 40029,
45
+    #     "errmsg": "invalid code"
46
+    # }
47
+    session_info = get_session_info(appid=appid, secret=secret, code=code)
48
+    logger.debug(session_info)
49
+    session_key = session_info.get('session_key', '')
50
+    unionid = session_info.get('unionid', '')
51
+    openid = session_info.get('openid', '')
52
+
53
+    # Get or Create User
54
+    user, _ = UserInfo.objects.select_for_update().get_or_create(openid=openid)
55
+
56
+    # Set User Key's Value
57
+    if unionid:
58
+        user.unionid = unionid
59
+    user.save()
60
+
61
+    # Store SessionKey
62
+    store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))
63
+
64
+    return response(data=user.data)
65
+
66
+
67
+@logit
68
+@transaction.atomic
69
+def get_userinfo_api(request):
70
+    wxcfg = WECHAT.get('MINIAPP', {})
71
+
72
+    appid = wxcfg.get('appID')
73
+    secret = wxcfg.get('appsecret')
74
+
75
+    user_id = request.POST.get('user_id', '')
76
+    encryptedData = request.POST.get('encryptedData', '')
77
+    iv = request.POST.get('iv', '')
78
+
79
+    try:
80
+        user = UserInfo.objects.get(user_id=user_id, status=True)
81
+    except UserInfo.DoesNotExist:
82
+        return response()
83
+
84
+    # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
85
+    #  u'city': u'Guangzhou',
86
+    #  u'country': u'CN',
87
+    #  u'gender': 1,
88
+    #  u'language': u'zh_CN',
89
+    #  u'nickName': u'Band',
90
+    #  u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
91
+    #  u'province': u'Guangdong',
92
+    #  u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
93
+    #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
94
+    session_key = get_session_key(appid=appid, secret=secret, unid=user_id, storage=RedisStorage(r))
95
+    # Get Userinfo
96
+    userinfo = get_userinfo(appid=appid, secret=secret, session_key=session_key, encryptedData=encryptedData, iv=iv)
97
+
98
+    # Set User Key's Value
99
+    user.unionid = userinfo.get('unionId', '')
100
+    user.openid_miniapp = userinfo.get('openId', '')
101
+    user.nickname = userinfo.get('nickName', '')
102
+    user.sex = userinfo.get('gender', '')
103
+    user.avatar = userinfo.get('avatarUrl', '')
104
+    user.country = userinfo.get('country', '')
105
+    user.province = userinfo.get('province', '')
106
+    user.city = userinfo.get('city', '')
107
+    user.save()
108
+
109
+    return response(data=user.data)

+ 6 - 1
api/urls.py

@@ -2,10 +2,15 @@
2 2
 
3 3
 from django.conf.urls import url
4 4
 
5
-from api import oauth_views, pack_views
5
+from api import mini_views, oauth_views, pack_views
6 6
 
7 7
 
8 8
 urlpatterns = [
9
+    url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'),  # 小程序登录
10
+    url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'),  # 获取用户信息
11
+]
12
+
13
+urlpatterns += [
9 14
     url(r'^pack$', pack_views.pack_detail, name='pack_detail'),
10 15
 ]
11 16
 

+ 1 - 0
requirements_dj.txt

@@ -10,6 +10,7 @@ django-redis-connector==1.0.3
10 10
 django-response==1.1.1
11 11
 django-rlog==1.0.7
12 12
 django-short-url==1.1.4
13
+django-shortuuidfield==0.1.3
13 14
 django-six==1.0.4
14 15
 django-uniapi==1.0.7
15 16
 django-we==1.5.5